/********************************************************************* (おまけ)DirectShow を直接 HSP で取扱ってみるサンプル DirectShow経由でメディアファイルを開きます。 MCIを使ったほうが断然早いような気が…。 でも、対応したデコーダとスプリッタがあれば、FLVだろうとMP4だろうと 取扱えるので便利かもしれない。 *********************************************************************/ #define CLSID_FilterGraph "{e436ebb3-524f-11ce-9f53-0020af0ba770}" #define IID_GraphBuilder "{56a868a9-0ad4-11ce-b03a-0020af0ba770}" #define IID_MediaControl "{56a868b1-0ad4-11ce-b03a-0020af0ba770}" #define IID_MediaPosition "{56a868b2-0ad4-11ce-b03a-0020af0ba770}" #define IID_MediaSeeking "{36b73880-c2c8-11cf-8b46-00805f6cef60}" #define IID_VideoWindow "{56a868b4-0ad4-11ce-b03a-0020af0ba770}" #define IID_BasicVideo "{56a868b5-0ad4-11ce-b03a-0020af0ba770}" #define WS_CHILD 0x40000000 #define WS_CLIPSIBLINGS 0x04000000 #define WM_APP 0x8000 #define WM_GRAPH_NOTIFY WM_APP + 1 #usecom IGraphBuilder IID_GraphBuilder CLSID_FilterGraph #usecom IMediaControl IID_MediaControl CLSID_FilterGraph #usecom IMediaPosition IID_MediaPosition CLSID_FilterGraph #usecom IMediaSeeking IID_MediaSeeking CLSID_FilterGraph #usecom IVideoWindow IID_VideoWindow CLSID_FilterGraph #usecom IBasicVideo IID_BasicVideo CLSID_FilterGraph // COMの初期化 newcom pGraphBuilder, IGraphBuilder // COMのQueryInterface呼び出し querycom pMediaControl, pGraphBuilder, IMediaControl querycom pMediaSeeking, pGraphBuilder, IMediaSeeking querycom pMediaPosition, pGraphBuilder, IMediaPosition querycom pVideoWindow, pGraphBuilder, IVideoWindow querycom pBasicVideo, pGraphBuilder, IBasicVideo onerror gosub *error : onerror 0 ; COMエラー回避用 onexit *exit dialog "*", 16 if stat == 0 : end pMediaControl->"RenderFile" refstr if stat != 0 : dialog "レンダラ失敗", 1 : gosub *exit // ビデオ レンダラが接続されていない場合、 // IVideoWindowインターフェイスのメソッドはすべてエラー コード VFW_E_NOT_CONNECTED を返す。 // そのためか、HSP側でエラーが発生し終了してしまうのでonerrorで一時的に回避。 ;mes varuse(pVideoWindow) onerror 1 ; エラー回避 pVideoWindow("WindowStyle") = WS_CHILD | WS_CLIPSIBLINGS pVideoWindow("Owner") = hwnd pVideoWindow->"SetWindowPosition" 0, 0, 640, 480 onerror 0 ; エラー回避終了 pMediaPosition("Rate") = 1.3f ; 再生速度が指定可能 pMediaControl->"Run" val = pMediaPosition("StopTime") ; トータル時間を取得 repeat ; 再生時リピート val2 = pMediaPosition("CurrentPosition") ; 現在の時間を取得 title ""+strf("%4.1f秒", val2) if val2 == val : pMediaPosition("CurrentPosition") = 0 : pMediaControl->"Run" wait 12 loop stop *exit pMediaControl->"Stop" delcom pBasicVideo delcom pVideoWindow delcom pMediaSeeking delcom pMediaPosition delcom pMediaControl delcom pGraphBuilder end *error return